package com.problem.stack;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

/**
 *
 * 42
 * https://leetcode-cn.com/problems/trapping-rain-water/
 */
public class TrappingRainWater {

    //给定 n 个非负整数表示每个宽度为 1 的柱子的高度图，计算按此排列的柱子，下雨之后能接多少雨水。
    //
    //
    //
    //上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图，在这种情况下，可以接 6 个单位的雨水（蓝色部分表示雨水）。 感谢 Marcos 贡献此图。
    //
    //示例:
    //
    //输入: [0,1,0,2,1,0,1,3,2,1,2,1]
    //输出: 6


    //todo
    public int trap(int[] height) {
        Stack<Integer> stack= new Stack<>();

        int v = 0;
        for (int h : height) {


            if (stack.empty()) {
                if (h != 0) {
                    stack.push(h);
                } else {
                    continue;
                }
            } else {
                if (stack.peek() >h) {
                    stack.push(h);
                } else if (stack.peek() == h) {
                    continue;
                } else {
                    int m = stack.pop();
                    if (stack.empty()) {
                        stack.push(h);
                    } else {
                        stack.push(m);
                        stack.push(h);
                        System.out.println(stack);
                        List<Integer> l1 = new ArrayList<>();
                        List<Integer> l2 = new ArrayList<>();
                        int y;
                        do {
                            l1.add(y=stack.pop());
                            l2.add(y);
                        }while (!stack.empty());
                        l2.sort((i1,i2)->i1.compareTo(i2));
                        int vvvv=0;
                        for (int j=0;j<l1.size(); j++) {
                            if (j == 0) {
                                continue;
                            }
                            if (j == l1.size() - 1) {
                                continue;
                            }
                            vvvv+=l1.get(j);
                        }
                        int v1 = l2.get(l2.size()-2)*(l2.size()-2) -vvvv;
                        v += v1;
                        System.out.println(v1);
                        stack.push(h);
                    }
                }
            }
        }

        return v;
    }

    public static void main(String[] args) {
        TrappingRainWater a = new TrappingRainWater();
        int [] height = new int[]{0,1,0,2,1,0,1,3,2,1,2,1};
        System.out.println(a.trap(height));
    }
}

